function ProcessLjComment(commentText) {
	//список названий, которые могут быть названиями мест
	var placesCandidates = new Array()

	//список объектов найденных мест
	var places = new Array()

	//прогоняем строку по различным методам поиска
	ProcessUpperCaseWords(commentText);
	ProcessLinks(commentText);
	ProcessQuotes(commentText);
	ProcessAddresses(commentText);
	print(placesCandidates);

	//geocodeCandidates(placesCandidates);
	
	return places;
	//return "";

	
	//добавляет кандидата в список кандидатов, отсеивая мусор
	function addCandidate(placeCandidateName){
	//отсеиваем шлак типа адресов картинок, тэгов и путей
	if(placeCandidateName.search(/(.jpg)|(.gif)|(.html)|(.htm)|(nofollow)|(_blank&quot)|(&mdash)|(^[0-9 .,]+$)|([<>=])|(\/)/i) == -1){	
		if(placeCandidateName.search('"') != -1){			
			placeCandidateName = placeCandidateName.slice(0,-2); //удаляем '\"' в конце имени, если это просочилось.
		}		
		placesCandidates.push(placeCandidateName);
	}
	}

	/*
	отправляет запрос на GoogleMaps, разбирает ответ, 
	если такое место нашлось, до добавляет его в места
	*/
	function geocodeCandidates(candidates){
	for(var i=0; i<candidates.length; i++) {
		response = GoogleMapsRequest(candidates[i]);

		response = response.slice(0, -6); //отсекаем '0' в конце ответа
		responseObj = JSON.parse(response);
	
		//http://code.google.com/intl/ru/apis/maps/documentation/geocoding/#GeocodingResponses

		if (responseObj.Status.code !=200){
			print("Not found: "+candidates[i])
			continue;
		}
		
		//Нашли, но нашли всего лишь город, а не конкретное место
		var townLevelAccuracy = 4;		
		placemark = responseObj.Placemark[0];
		if (placemark.AddressDetails.Accuracy <= townLevelAccuracy){
			print("Only city founded: "+candidates[i])
			continue;
		}

		placeName = responseObj.name;
		address = placemark.address;
		address = address.replace("&","");
		longitude = placemark.Point.coordinates[0];
		latitude = placemark.Point.coordinates[1];

		place = {	"name": candidates[i],
					"address": address,
					"latitude": latitude,
					"longitude": longitude };

		//print(JSON.stringify(place));
		places.push(place);
	}
	}

	//Ищем все слова/словосочетания слов с большой буквы
	function ProcessUpperCaseWords(commentText){
	//коэффициент, определяющий, насколько далеко должно быть
	//следующее слово с большой буквы, чтобы считать это 
	//одним названием.		
	var wordsDistance = 15;
	
	while(true){
		n = commentText.search(/[^,.?!:;<>] [A-ZА-Я].*[ .,?!/:;()]/);
	    if(n == -1) break;
	    tmp = commentText.slice(n+2,-1);

		//ищем следующие за ним слова с большой буквы
		n2 = tmp.search(/[^,.?!:;<>] [A-ZА-Я].*[ .,?!/:;()]/); 
		if(n2 == -1 || n2 > wordsDistance){
			n3 = tmp.search(/[ .,?!<>/()]/); //таких слов нет, ограничимся этим
			res = tmp.slice(0, n3);
			commentText = tmp.slice(n3+1, -1); 
		} else {
		    tmp2 = tmp.slice(n2+2,-1);  //нашли, ищем конец этой последовательности
			n3 = tmp2.search(/[ .,?!</;:()]/);
			res = tmp.slice(0, n2+2+n3); 
			commentText = tmp2.slice(n2+3+n3, -1);
		}

		addCandidate(res);
	}	
	}

	//Ищем всё <а>подписи</a> к ссылкам 
	function ProcessLinks(commentText){
	while(true){
		n = commentText.search(/>[^<>]*<\/a>/);
	    if(n == -1) break;
	    tmp = commentText.slice(n+1,-1);
		n2 = tmp.search(/<\/a>/);
		res = tmp.slice(0, n2);
		commentText = tmp;
		addCandidate(res);
	}	
	}	

	//Ищем всё, заключённое в кавычки
	function ProcessQuotes(commentText){
	while(true){
		n = commentText.search("\"");
	    if(n == -1) break;
	    tmp = commentText.slice(n+1,-1);
		n2 = tmp.search("\"");
		res = tmp.slice(0, n2-1);	
		commentText = tmp.slice(n2, -1);	
	
		//не учитываем адреса и большие строки (вероятно найденные ошибочно)
		if(res.search(/http:/) != 0 && res.length < 50) {
			addCandidate(res);
		}
	}	
	}

	//Ищем всё, похожее на адрес
	function ProcessAddresses(commentText){
	while(true){
		//различные префиксы адреса
		var addressKeyWords = [ "ул\\.", "пр\\.", "пл\\.", "площад ", "просп\\.", "проспект ", "улица ", "бул\\ ", "бульвар ", "пер\\.", "переулок "];
		addressFound = false;
		prefixLength = 0;
		
		for(var i=0; i<addressKeyWords.length; i++) {	
			n = commentText.search(new RegExp(addressKeyWords[i],'i'));
			if(n != -1)
			{
				addressFound = true;
				prefixLength = addressKeyWords[i].length;
				break;
			}
		}

	    if(!addressFound){
			 break;		
		}

	    res = commentText.slice(n,-1);
	    tmp = commentText.slice(n + prefixLength, -1);
		n2 = tmp.search(/[0-9]+/); //пытаемся найти номер дома

		notHouseNumberDistance = 50; //максимальное расстояние от префикса до номера дома.
		nameBeforePrefixDistance = 50; //максимальная длина названия улицы, если оно до префикса
		houseNumberMinDistance = 4; //минимальное расстояние, при котором считается что название улицы между префиксом и номером.

        if(n2 == -1 || n2 > notHouseNumberDistance)    //если не вышло, то цепляемся хотя бы за улицу/проспект
		{
			n2 = tmp.search(/[^A-Za-zА-Яа-я]/);
		} else if(n2 < houseNumberMinDistance) {      //если номер дома сразу после 'пр.', то ищем название слева
			tmp2 = tmp.slice(n2, -1);
			
			n2 = n2 + tmp2.search(/[ .!?:;<>()]/);	//ищем конец номера дома	
			tmp = commentText.slice(n-nameBeforePrefixDistance, -1); 
            
			n = tmp.search(/[A-ZА-Я]/);
			if(n != -1){
				tmp = tmp.slice(n, n + n2 + nameBeforePrefixDistance);			
				commentText = tmp.slice(n + n2 + nameBeforePrefixDistance + 1, -1);						
				addCandidate(res);		//название улицы найдено до префикса.
				continue;			 
			}
		} else {
		    tmp2 = tmp.slice(n2, -1);		//ищем конец номера дома 		
			n2 = n2 + tmp2.search(/[ .!?:;<>()]/);
		}
		
		res = res.slice(0, n2 + prefixLength);	
		commentText = tmp.slice(n2 + 1, -1);			
		
		addCandidate(res);		
	}	
}	


}

